package com.zapi.ai.service.impl;

import com.zapi.ai.config.QwenConfig;
import com.zapi.ai.model.*;
import com.zapi.ai.service.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.List;
import java.util.ArrayList;

/**
 * AI聊天服务实现
 * 集成阿里云通义千问，支持真实AI对话和业务系统操作
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AiChatServiceImpl implements AiChatService {
    
    private final QwenConfig qwenConfig;
    private final QwenService qwenService;
    private final AiChatHistoryService chatHistoryService;
    private final AiFunctionCallingService functionCallingService;
    private final ApiExecutorService apiExecutorService;
    private final ApiScannerService apiScannerService;
    private final ProjectKnowledgeService projectKnowledgeService;
    
    // 会话存储（生产环境建议使用Redis）
    private final Map<String, List<ChatMessage>> sessionStore = new ConcurrentHashMap<>();
    
    @Override
    public ChatResponse chat(ChatRequest request) {
        try {
            log.info("收到AI聊天请求: sessionId={}, message={}", request.getSessionId(), request.getMessage());
            
            // 获取或创建会话ID
            String sessionId = request.getSessionId();
            if (sessionId == null || sessionId.isEmpty()) {
                sessionId = UUID.randomUUID().toString();
            }
            
            // 获取用户ID（从request或使用默认值）
            String userId = request.getUserId() != null ? request.getUserId() : "default_user";
            
            // 获取会话历史（先从数据库加载，如果没有则创建新的）
            List<ChatMessage> history = sessionStore.get(sessionId);
            if (history == null) {
                history = chatHistoryService.getSessionHistory(sessionId);
                if (history.isEmpty()) {
                    history = new ArrayList<>();
                }
                sessionStore.put(sessionId, history);
            }
            
            // 构建完整的用户消息（包含文本、图片、文件信息）
            String fullMessage = buildFullMessage(request);
            
            // 创建用户消息对象
            ChatMessage userMessage = new ChatMessage("user", fullMessage);
            if (request.getImages() != null) {
                userMessage.setImages(request.getImages());
            }
            if (request.getFiles() != null) {
                userMessage.setFiles((List<Object>)(List<?>) request.getFiles());
            }
            
            // 添加用户消息到历史
            history.add(userMessage);
            
            // 保存用户消息到数据库
            chatHistoryService.saveMessage(userId, sessionId, userMessage, qwenConfig.getModel(), 0);
            
            // Step 1: 尝试分析用户意图，判断是否需要调用业务API
            String aiResponse;
            Integer tokensUsed = 0;
            
            if (qwenConfig.isEnabled() && qwenConfig.getApiKey() != null && !qwenConfig.getApiKey().isEmpty()) {
                // 检查是否在询问项目信息
                if (projectKnowledgeService.isAskingAboutProject(fullMessage)) {
                    log.info("用户询问项目信息，加载项目知识库");
                    String projectInfo = projectKnowledgeService.getProjectInfo();
                    String enhancedMessage = projectInfo + "\n\n用户问题：" + fullMessage;
                    aiResponse = qwenService.chat(enhancedMessage, new ArrayList<>()); // 使用空历史，确保回答基于知识库
                    tokensUsed = 300;
                } else {
                    log.info("开始分析用户意图...");
                    FunctionCallRequest functionCall = functionCallingService.analyzeIntent(fullMessage);
                    
                    if (functionCall != null) {
                        // Step 2: 需要调用API，执行Function Calling
                        log.info("检测到API调用需求: {} {}", functionCall.getMethod(), functionCall.getPath());
                        
                        // 获取API元数据
                        ApiMetadata api = apiScannerService.getApi(functionCall.getMethod(), functionCall.getPath());
                        
                        if (api != null) {
                            // 执行API调用
                            String token = request.getToken(); // 从请求中获取用户token
                            ApiExecutorService.ApiExecutionResult result = 
                                    apiExecutorService.executeApi(api, functionCall.getParameters(), token);
                            
                            // 格式化API结果
                            aiResponse = functionCallingService.formatApiResult(functionCall, result);
                            tokensUsed = 200;
                        } else {
                            aiResponse = "抱歉，我找不到对应的API接口：" + functionCall.getPath() + 
                                       "\n\n可用的API可以通过\"查看系统功能\"命令查看。";
                            tokensUsed = 100;
                        }
                    } else {
                        // Step 3: 不需要调用API，进行正常对话
                        log.info("使用通义千问AI进行对话");
                        aiResponse = qwenService.chat(fullMessage, history);
                        tokensUsed = 150;
                    }
                }
            } else {
                // 使用模拟AI
                log.info("使用模拟AI服务（通义千问未启用）");
                aiResponse = generateMockResponse(fullMessage, history);
            }
            
            // 创建AI回复消息对象
            ChatMessage assistantMessage = new ChatMessage("assistant", aiResponse);
            
            // 添加AI回复到历史
            history.add(assistantMessage);
            
            // 保存AI回复到数据库
            chatHistoryService.saveMessage(userId, sessionId, assistantMessage, qwenConfig.getModel(), tokensUsed);
            
            // 限制历史消息数量，避免内存溢出
            if (history.size() > 50) {
                history = new ArrayList<>(history.subList(history.size() - 50, history.size()));
                sessionStore.put(sessionId, history);
            }
            
            log.info("AI回复成功: sessionId={}", sessionId);
            return ChatResponse.success(aiResponse, sessionId);
            
        } catch (Exception e) {
            log.error("AI聊天失败", e);
            return ChatResponse.error("AI服务暂时不可用，请稍后再试");
        }
    }
    
    @Override
    public void clearSession(String sessionId) {
        sessionStore.remove(sessionId);
        chatHistoryService.clearSessionHistory(sessionId);
        log.info("清除会话（内存和数据库）: sessionId={}", sessionId);
    }
    
    /**
     * 构建完整消息（包含图片和文件信息）
     */
    private String buildFullMessage(ChatRequest request) {
        StringBuilder message = new StringBuilder();
        
        // 添加文本消息
        if (request.getMessage() != null && !request.getMessage().isEmpty()) {
            message.append(request.getMessage());
        }
        
        // 添加图片信息
        if (request.getImages() != null && !request.getImages().isEmpty()) {
            if (message.length() > 0) {
                message.append("\n\n");
            }
            message.append("[用户上传了").append(request.getImages().size()).append("张图片]");
            message.append("\n注意：当前AI暂不支持图片内容识别，但已收到图片。如需分析图片，请描述图片内容。");
        }
        
        // 添加文件信息
        if (request.getFiles() != null && !request.getFiles().isEmpty()) {
            if (message.length() > 0) {
                message.append("\n\n");
            }
            message.append("[用户上传了").append(request.getFiles().size()).append("个文件: ");
            for (int i = 0; i < request.getFiles().size(); i++) {
                ChatRequest.FileInfo file = request.getFiles().get(i);
                if (i > 0) message.append(", ");
                message.append(file.getName());
            }
            message.append("]");
        }
        
        return message.toString();
    }
    
    /**
     * 生成模拟AI响应
     * 当通义千问未启用时使用
     */
    private String generateMockResponse(String userMessage, List<ChatMessage> history) {
        String lowerMessage = userMessage.toLowerCase();
        
        // 检查是否在询问项目信息
        if (projectKnowledgeService.isAskingAboutProject(userMessage)) {
            return projectKnowledgeService.getProjectInfo();
        }
        
        // 智能识别用户意图并给出相应回复
        if (lowerMessage.contains("你好") || lowerMessage.contains("hi") || lowerMessage.contains("hello")) {
            return "您好！我是您的AI助手，可以帮您操作后台管理系统。\n\n我可以帮您：\n" +
                   "📋 查询数据和报表\n" +
                   "📝 创建和编辑内容\n" +
                   "🔄 执行工作流操作\n" +
                   "⚙️ 配置系统设置\n\n" +
                   "请告诉我您需要什么帮助？";
        }
        
        if (lowerMessage.contains("流程") || lowerMessage.contains("工作流") || lowerMessage.contains("审批")) {
            return "我可以帮您处理工作流相关操作：\n\n" +
                   "1️⃣ 查看待办任务\n" +
                   "2️⃣ 创建新流程\n" +
                   "3️⃣ 查询流程状态\n" +
                   "4️⃣ 审批任务\n\n" +
                   "请告诉我具体需要做什么？";
        }
        
        if (lowerMessage.contains("表单") || lowerMessage.contains("form")) {
            return "关于表单功能，我可以协助您：\n\n" +
                   "📝 创建新表单\n" +
                   "✏️ 编辑表单字段\n" +
                   "👁️ 查看表单数据\n" +
                   "📊 导出表单数据\n\n" +
                   "您想进行哪个操作？";
        }
        
        if (lowerMessage.contains("用户") || lowerMessage.contains("账号")) {
            return "用户管理功能包括：\n\n" +
                   "👤 查看用户列表\n" +
                   "➕ 添加新用户\n" +
                   "✏️ 编辑用户信息\n" +
                   "🔒 重置密码\n" +
                   "🚫 禁用/启用用户\n\n" +
                   "请问您需要哪项操作？";
        }
        
        if (lowerMessage.contains("帮助") || lowerMessage.contains("help") || lowerMessage.contains("功能")) {
            return "## 🎯 系统功能概览\n\n" +
                   "### 核心模块\n" +
                   "• **工作流管理** - 流程设计、任务审批\n" +
                   "• **表单管理** - 表单设计、数据管理\n" +
                   "• **数据集管理** - 数据源、数据表\n" +
                   "• **系统管理** - 用户、角色、权限\n\n" +
                   "### 常用操作\n" +
                   "• 查询数据：\"帮我查看最近的审批任务\"\n" +
                   "• 创建内容：\"我想创建一个新的表单\"\n" +
                   "• 数据分析：\"统计本月的工作流数量\"\n\n" +
                   "直接告诉我您想做什么，我会指导您完成！";
        }
        
        // 默认回复
        return "我理解您说的是：\"" + userMessage + "\"\n\n" +
               "目前我还在学习中，暂时无法完全理解这个请求。\n\n" +
               "您可以尝试：\n" +
               "• 更详细地描述您的需求\n" +
               "• 使用关键词如：流程、表单、用户、查询等\n" +
               "• 输入\"帮助\"查看我能做什么\n\n" +
               "💡 提示：我正在不断学习，未来会更加智能！";
    }
}

